package abcwt112.p2;

/**
 * 2. 两数相加
 * <p>
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 * <p>
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 * <p>
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 * <p>
 * 示例：
 * <p>
 * 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出：7 -> 0 -> 8
 * 原因：342 + 465 = 807
 */

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode n1 = l1, n2 = l2;
        ListNode pre = null, first = null;
        byte add = 0;
        while (n1 != null || n2 != null || add != 0) {
            int val = (n1 != null ? n1.val : 0) + (n2 != null ? n2.val : 0) + add;
            if (add > 0) {
                add = 0;
            }
            if (val >= 10) {
                val = val - 10;
                add = 1;
            }
            ListNode tmp = new ListNode(val);
            if(pre == null) {
                pre = tmp;
                first = pre;
            } else {
                pre.next = tmp;
                pre = tmp;
            }
            n1 = n1 != null ? n1.next : null;
            n2 = n2 != null ? n2.next : null;
        }
        return first;
    }
}


class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }

    public static void main(String[] args) {
        ListNode tmp1 = new ListNode(2);
        ListNode tmp2 = new ListNode(4);
        ListNode tmp3= new ListNode(3);
        tmp1.next = tmp2;
        tmp2.next = tmp3;

        ListNode l1 = new ListNode(5);
        ListNode l2 = new ListNode(6);
        ListNode l3= new ListNode(7);
        l1.next = l2;
        l2.next = l3;

        Solution s = new Solution();
        ListNode listNode = s.addTwoNumbers(tmp1, l1);
        System.out.println(listNode);
    }
}
